package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import modelo.DetalleOrden;
import modelo.DetalleProducto;
import modelo.Ingrediente;
import modelo.Producto;
import modelo.Conexion;
import modelo.Orden;
import vista.VOrden;
import vista.VCliente;

public class COrden implements ActionListener{
	public VOrden vOrden;
	public Orden orden;
	public static Vector<DetalleOrden> detalles; 
	List<Ingrediente> listaIngrediente=new ArrayList<Ingrediente>();
	int i=0;
	Conexion BD;
	public COrden(VOrden vo){
		vOrden=vo;
		detalles=new Vector<DetalleOrden>();
		try {
			BD = new Conexion();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
		public void actionPerformed(ActionEvent ae) {
			if(ae.getSource()== vOrden.getBtnRegistrar()){
				if(validarCampos()){
				
				orden = new Orden(vOrden.getTxtCedula().getText(),vOrden.getTxtCodOrden().getText(),vOrden.getTxtFecha().getText(),Float.parseFloat(vOrden.getTxtTotal().getText()));
				if(detalles.size()==0)
					JOptionPane.showMessageDialog(new JFrame(), 
							"La orden debe poseeer un detalle","Orden",
							JOptionPane.WARNING_MESSAGE);
				else{
				BD.insertarOrden(orden);
				BD.insertarOrdenPorProducto(detalles);
				BD.ActualizarIngredientesPorVenta(listaIngrediente);
				JOptionPane.showMessageDialog(new JFrame(), 
						"La orden se ha registrado","Orden", 
						JOptionPane.INFORMATION_MESSAGE);
				inicio();
				}
				}
				else
					JOptionPane.showMessageDialog(new JFrame(), 
							"Por favor llene todos los campos","Orden", 
							JOptionPane.INFORMATION_MESSAGE);
			}
			if(ae.getSource()== vOrden.getBtnRegProducto()){
				boolean encontrado,agotado=false;
				float existenciaActual,total=0;
				String cantidad=vOrden.getTxtCantidad().getText();
				String nombre=vOrden.getJcbProductos().getSelectedItem().toString();
				if(nombre.equals("Seleccione una Categoria") || nombre.equals("No tiene productos") || cantidad.equals(""))
					JOptionPane.showMessageDialog(new JFrame(), 
							"Por favor llene todos los campos","Orden", 
							JOptionPane.INFORMATION_MESSAGE);
				else
				{
				int cantidadPedida=Integer.parseInt(vOrden.getTxtCantidad().getText());
				String codProducto;
					codProducto = BD.ObtenerCodProducto(vOrden.getJcbProductos().getSelectedItem().toString());
					List<DetalleProducto> listaDetalleProducto=BD.cargarIngredientesPorProductosCod(codProducto);
			
				
				Ingrediente ingrediente1 = null,ingrediente2;
				DetalleProducto detalleProducto;
				if(!listaIngrediente.isEmpty()){
					agotado=false;
					for(int i=0;i<listaDetalleProducto.size();i++){
						encontrado=false;
						detalleProducto=listaDetalleProducto.get(i);
						float cantidadTotal=cantidadPedida*detalleProducto.getCantidad();
						ingrediente1=BD.consultarIngrediente(detalleProducto.getCodIngrediente());
					    for(int j=0;j<listaIngrediente.size();j++){
							ingrediente2=listaIngrediente.get(j);
							if(ingrediente2.getCodIngrediente().toString().compareTo(ingrediente1.getCodIngrediente().toString())==0){
								if(cantidadTotal>ingrediente2.getExistencia()){
									JOptionPane.showMessageDialog(new JFrame(), 
											"No se puede realizar el pedido por falta de '"+ingrediente1.getDescripcion()+"'","Orden", 
											JOptionPane.INFORMATION_MESSAGE);
									agotado=true;
								}
								else{
									existenciaActual=ingrediente2.getExistencia()-cantidadTotal;
									ingrediente2.setExistencia(existenciaActual);
							           }
								encontrado=true;
						     }		
					}
					if(!encontrado){
						    if(cantidadTotal>ingrediente1.getExistencia()){
								JOptionPane.showMessageDialog(new JFrame(), 
										"No se puede realizar el pedido por falta de '"+ingrediente1.getDescripcion()+"'","Orden", 
										JOptionPane.INFORMATION_MESSAGE);
						    agotado=true;}
							    else{
							       ingrediente1.setExistencia(ingrediente1.getExistencia()-cantidadTotal);
							        listaIngrediente.add(ingrediente1);
							        }
					                 }	
					}
					}	
				else{
					for(int i=0;i<listaDetalleProducto.size();i++){
						detalleProducto=listaDetalleProducto.get(i);
						float cantidadTotal=cantidadPedida*detalleProducto.getCantidad();
							ingrediente1=BD.consultarIngrediente(detalleProducto.getCodIngrediente());
							if(cantidadTotal>ingrediente1.getExistencia()){
								JOptionPane.showMessageDialog(new JFrame(), 
										"No se puede realizar el pedido por falta de '"+ingrediente1.getDescripcion()+"'","Orden", 
										JOptionPane.INFORMATION_MESSAGE);
							agotado=true;}
							else{
							ingrediente1.setExistencia(ingrediente1.getExistencia()-cantidadTotal);
						    listaIngrediente.add(ingrediente1);
							}
						
				       }
				}	
				DetalleOrden detalleOrden;
				if(!agotado){
				float totalActual=Float.parseFloat(vOrden.getTxtTotal().getText());
				Producto producto;
				producto = BD.consultarProducto(codProducto);
				total=total+(producto.getPrecio()*cantidadPedida);
				vOrden.getTxtTotal().setText(String.valueOf(total+totalActual));
				
				detalleOrden = new DetalleOrden(Integer.parseInt(vOrden.getTxtCantidad().getText()),vOrden.getTxtCodOrden().getText(),codProducto);
				detalles.add(detalleOrden);
				vOrden.getListaModel().addElement(detalleOrden.getCodOrden()+"  "+nombre + " "+vOrden.getTxtCantidad().getText());
				}
				}
								}
			if(ae.getSource()== vOrden.getBtnRemover()){
				int indice=vOrden.getListaProductos().getSelectedIndex();
				if(indice>=0){
				vOrden.getListaModel().remove(indice);
				DetalleOrden detalle=detalles.remove(indice);
				Producto producto=BD.consultarProducto(detalle.getCodProducto());
				float totalActual=Float.parseFloat(vOrden.getTxtTotal().getText());
				float total=producto.getPrecio()*detalle.getCantidad();
				vOrden.getTxtTotal().setText(String.valueOf(totalActual-total));
				}
				else
					JOptionPane.showMessageDialog(new JFrame(), 
							"Por favor seleccione el producto que desea remover","Orden", 
							JOptionPane.INFORMATION_MESSAGE);
			}
			if(ae.getSource()== vOrden.getBtnBuscar()){
				String codorden=vOrden.getTxtCodOrden().getText();
				if(codorden.equals(""))
					JOptionPane.showMessageDialog(new JFrame(), 
							"Por favor introduzca el codigo de la orden","Orden", 
							JOptionPane.ERROR_MESSAGE);
				else{
				Orden orden=BD.consultarOrden(codorden);
				if(orden==null){
					JOptionPane.showMessageDialog(new JFrame(), 
							"La Orden no se encuentra registrada","Orden", 
							JOptionPane.INFORMATION_MESSAGE);
				noEncontrado();
				}
				else{
					vOrden.getTxtCedula().setText(orden.getCedula());
					vOrden.getTxtFecha().setText(orden.getFecha());
					vOrden.getTxtTotal().setText(String.valueOf(orden.getTotalPagar()));
				}
				}
				}
			if(ae.getSource()== vOrden.getJcbCategorias()){
				vOrden.getJcbProductos().removeAllItems();
				String nombre=vOrden.getJcbCategorias().getSelectedItem().toString();
				Vector<String> descripcionProducto=BD.cargarProductosCodicionados(nombre);
				if(descripcionProducto.size()!=0){
					for(int i=0;i<descripcionProducto.size();i++){
						nombre=descripcionProducto.get(i);
					vOrden.getJcbProductos().addItem(nombre);
					}	
					}
					else
						vOrden.getJcbProductos().addItem("No tiene productos");
				
					
			}
			if(ae.getSource()== vOrden.getTxtFecha()){
				System.out.println("hola");
			}
			
		}
		public boolean validarCampos(){
			boolean validar=true;
			if(vOrden.getTxtCedula().getText().equals("") || vOrden.getTxtFecha().getText().equals(""))
				validar=false;
			return validar;
		}
		public void limpiarCampos(){
			vOrden.getTxtCantidad().setText("");
			vOrden.getTxtCedula().setText("");
			vOrden.getTxtCodOrden().setText("");
			vOrden.getTxtTotal().setText("0");
			vOrden.getListaModel().clear();
			vOrden.getTxtCodOrden().requestFocus(true);
			desActivar();
				}
		public void encontrado(){
			vOrden.getTxtCedula().setEditable(false);
			vOrden.getBtnLimpiar().setEnabled(true);
			vOrden.getBtnRegistrar().setEnabled(false);
		}
		public void noEncontrado(){
			vOrden.getBtnRegistrar().setEnabled(true);
			vOrden.getBtnRegProducto().setEnabled(true);
			vOrden.getBtnRemover().setEnabled(true);
			vOrden.getTxtCedula().setEditable(true);
			vOrden.getTxtCantidad().setEditable(true);
			vOrden.getTxtFecha().setEditable(true);
			vOrden.getJcbCategorias().setEnabled(true);
			vOrden.getJcbProductos().setEnabled(true);
			vOrden.getBtnLimpiar().setEnabled(true);
			vOrden.getTxtCodOrden().setEditable(false);
		}
		public void desActivar(){
			vOrden.getBtnRegistrar().setEnabled(false);
			vOrden.getTxtCedula().setEditable(false);
			vOrden.getTxtCantidad().setEditable(false);
			vOrden.getBtnLimpiar().setEnabled(false);
			vOrden.getTxtCodOrden().setEditable(true);	
			
		}
		public void inicio(){
			vOrden.getBtnRegistrar().setEnabled(false);
			vOrden.getBtnLimpiar().setEnabled(false);
		    limpiarCampos();
			
		}
	
		
		

}
